home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / c / pcw.zip / GETCHARS.C < prev    next >
C/C++ Source or Header  |  1991-12-28  |  4KB  |  144 lines

  1. /***************************************************************/
  2. /* File Id.                     GetChars.C.                    */
  3. /* Author.                      Stan Milam.                    */
  4. /* Date Written.                12/02/89.                      */
  5. /*                                                             */
  6. /*            (c) Copyright 1989, 1990 by Stan Milam           */
  7. /*                                                             */
  8. /* Custom Routine to accept buffered input at any location on  */
  9. /* the screen.  Input field on screen can be any color, and the*/
  10. /* length of the input field is specified.  Can use left/rite  */
  11. /* arrow keys, insert, delete, and backspace.                  */
  12. /***************************************************************/
  13.  
  14. #include <stdio.h>
  15. #include <conio.h>
  16. #include <string.h>
  17. #include "pcwproto.h"
  18. #include "keys.h"
  19.  
  20. static void beep(void);
  21.  
  22. static void beep() {
  23.     _sound(880);
  24.     rest(4);
  25.     _nosound();
  26. }
  27.  
  28. int get_chars(int row, int col, int fclr, int bclr, int len, char *buffer) {
  29.  
  30.    int  i, j, k;
  31.    int  ch;
  32.  
  33.  /*   memset(buffer,0,len); len--; */
  34.    len--;
  35.    qfill(row, col, row, col+len, fclr, bclr, 32);
  36.    qputs(row, col, fclr, bclr, buffer);
  37.    set_cursor_pos(row, col); j = i = 0; k = col;
  38.    for (;;) {
  39.       ch = keyin();
  40.       get_cursor_pos(&row, &k);
  41.       switch (ch) {
  42.          case BOTH_MOUSE_KEY :
  43.          case ENTER : return(0);
  44.          case RITE_MOUSE_KEY :
  45.          case ESC : return(ESC);
  46.          case 3   :                         /* Ctrl C or Ctrl Break */
  47.          case F1  :
  48.          case F2  :
  49.          case F3  :
  50.          case F4  :
  51.          case F5  :
  52.          case F6  :
  53.          case F7  :
  54.          case F8  :
  55.          case F9  :
  56.          case F10 :
  57.          case PGUP:
  58.          case PGDN:
  59.          case TAB :
  60.          case UPARROW:
  61.          case DOWNARROW:
  62.          case SHFTTAB: continue;            /* Ignore all of these keys */
  63.  
  64.          case HOME:
  65.             j = 0;
  66.             set_cursor_pos(row, col);
  67.             continue;
  68.  
  69.          case END :
  70.             j = strlen(buffer);
  71.             set_cursor_pos(row, col + j);
  72.             continue;
  73.  
  74.          case INS :
  75.             i = strlen(buffer);
  76.             if (i >= (len+1) || j >= len) {
  77.                beep();
  78.                continue;
  79.             }
  80.             for (; i > j; i--) buffer[i] = buffer[i-1];
  81.             buffer[j] = (char) SPACES;
  82.             qputs(row, col, fclr, bclr, buffer);
  83.             continue;
  84.  
  85.          case DEL :
  86.             qputchar(row, k, fclr, bclr, SPACES);
  87.             i = strlen(&buffer[j]) - 1;
  88.             i = (i < 0) ? 0 : i;
  89.             qputchar(row, k + i, fclr, bclr, SPACES);
  90.             memcpy(&buffer[j], &buffer[j+1], strlen(&buffer[j+1]));
  91.             i = strlen(buffer) - 1;
  92.             buffer[(i < 0) ? 0 : i] = 0;
  93.             qputs(row, k, fclr, bclr,&buffer[j]);
  94.             continue;
  95.  
  96.          case LEFTARROW :
  97.             if (j <= 0) {
  98.                beep();
  99.                continue;
  100.             }
  101.             j--;
  102.             set_cursor_pos(row, --k);
  103.             continue;
  104.  
  105.          case RITEARROW :
  106.             if (j > len || buffer[j] == 0) {
  107.                beep();
  108.                continue;
  109.             }
  110.             j++;
  111.             set_cursor_pos(row, ++k);
  112.             continue;
  113.  
  114.          case BACKSPACE :                         /* '\b': */
  115.             if (j <= 0) {
  116.                beep();
  117.                continue;
  118.             }
  119.             i = strlen(&buffer[j]) - 1;
  120.             qputchar(row, k + i, fclr, bclr, SPACES);
  121.             j--;
  122.             memcpy(&buffer[j], &buffer[j+1], strlen(&buffer[j+1])+1);
  123.             qputs(row, --k, fclr, bclr, &buffer[j]);
  124.             set_cursor_pos(row, k);
  125.             continue;
  126.  
  127.          default  :
  128.             if (j > len) {
  129.                beep();
  130.                continue;
  131.             }
  132.             if ischar(ch) {
  133.                 buffer[j++] = (char) ch;
  134.                 qputchar(row, k, fclr, bclr, (char) ch);
  135.                 set_cursor_pos(row, ++k);
  136.             }
  137.             break;
  138.       }
  139.    }
  140. #ifndef __TURBOC__
  141.    return(0);
  142. #endif
  143. }
  144.